package co.edu.usbcali.egrapico.logica;

import java.util.Vector;

/**
 * Clase para la traducci�n de una
 * <Code>Lista de M�todos</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo
 * PiCO</I>. <P> Recibe en <I>GraPiCO Textual</I> alguna de las opciones:<P> <Blockquote><Pre>
 *                   M�todo_1 & ... & M�todo_n
 *                   M�todo
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> de cada
 * contructor:<P> <Blockquote><Pre>
 *                   M�todo_1 & ... & M�todo_n
 *                   M�todo
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class MethodsList {

    //Variable para almacenar la lista de m�todos representada en c�lculo PiCO.
    String methodsListPico = "";
    //Variable para almacenar una lista de m�todos representados en GraPiCO Textual.
    Vector methods;
    //Variable para contar cuando empieza y termina un programa.
    int countProgram = 0;
    //Variable para almacenar la longitud de la lista de M�todos en GraPiCO Textual.
    int longExpression = 0;
    //Variable para almacenar donde empieza un M�todo.
    int initMethod = 0;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>MethodsList</Code>.<P> Separa los
     * <Code>M�todos</Code> de la
     * <Code>Lista de M�todos</Code> usando el s�mbolo de sincronizaci�n "&".
     *
     * @param methodsListGraPicoT Expresi�n equivalente a la representaci�n de
     * una
     * <Code>Lista de M�todos</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public MethodsList(String methodsListGraPicoT, String nameProcess) {

        nameCurrentProcess = nameProcess;
        methods = new Vector();
        longExpression = methodsListGraPicoT.length();
        for (int limit = 0; limit < longExpression; limit++) {
            if (methodsListGraPicoT.charAt(limit) == '{') {
                countProgram++;
            } else {
                if (methodsListGraPicoT.charAt(limit) == '}') {
                    countProgram--;
                } else {
                    if ((methodsListGraPicoT.charAt(limit) == '&') && (countProgram == 0)) {
                        methods.addElement(methodsListGraPicoT.substring(initMethod, limit));
                        initMethod = limit + 1;
                    }
                }
            }
        }
        methods.addElement(methodsListGraPicoT.substring(initMethod));
    }

    /**
     * M�todo generador de la traducci�n de una
     * <Code>Lista de M�todos</Code>.<P> Obtiene la traducci�n de cada
     * <Code>M�todo</Code> y los concatena separ�ndolos con el s�mbolo de
     * sincronizaci�n "&".
     *
     * @return la
     * <Code>Lista de M�todos</Code> traducida a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        int size = methods.size();
        for (int count = 0; count < size; count++) {
            Method method = new Method((String) methods.get(count), nameCurrentProcess);
            if (count < size - 1) {
                methodsListPico += method.traslate() + " & ";
            } else {
                methodsListPico += method.traslate();
            }
        }

        return methodsListPico;
    }
}